package DP.singleton;

/**
 * @author msi
 */
public class Singleton {

    //private static Singleton singleton = new Singleton();//饿汉式的实现
    private static Singleton singleton = null;

    private Singleton(){

    }

    /**
     * 1.饿汉式：在定义变量的时候创建对象。
     * 优点：线程安全，不需要加锁
     * 缺点：不能延迟创建对象。
     * @return
     */
    public static Singleton getInstance1(){
        return singleton;
    }

    /**
     * 2.懒汉式(线程不安全)：调用方法的时候创建
     * @return
     */
    public static Singleton getInstance2(){
        if(null == singleton){
            singleton =new Singleton();
        }
        return  singleton;
    }

    /**
     * 3.懒汉式(线程安全的，双重校验锁):加锁的粒度尽量小，在JVM中这种同步互斥锁涉及到操作系统用户态和核心态的切换。
     * 优点：线程安全，支持延迟创建对象，需要加锁
     * @return
     */
    public static Singleton getInstance3(){
        if(null == singleton){
            synchronized (Singleton.class){
                if(null == singleton){
                    singleton =new Singleton();
                }
            }
        }
        return  singleton;
    }


    /**
     * 4.静态内部类
     * 优点：延迟创建，不需要加锁，线程安全
     */
    private static class SingletonBuilder{
        private static final Singleton SINGLETON=new Singleton();
    }

    public static Singleton getInstance4(){
        return SingletonBuilder.SINGLETON;
    }

    /**
     * 5.枚举实现
     */
    public static Single getInstance5(){
        return Single.SINGLETON;
    }
}

/**
 * 5.枚举实现：
 * 线程安全
 */
enum Single{
    SINGLETON;//该对象全局唯一
}
